<?php
/**
 * Класс который берет из контейнера последних скачанных фидов, фиды скачанные в рамках этой сессии и
 * постит их в сообщество
 * 
 * @author Alexander Sibiryakov
 **/
class RssPublisher {
	private $treatment;
	private $rss_tmp_st;
	private $rss_fs;
		
	public function __construct(RssTmpStore $rss_tmp_st, Model_RssFeedSnapshots $rss_fs, $treatment) {
		$this->rss_tmp_st = $rss_tmp_st;
		$this->rss_fs = $rss_fs;
		$this->treatment = $treatment;
	}
	
	/**
	 * Провести обработку содержимого хранилища
	 */
	public function publish() {
		foreach($this->rss_tmp_st->retAll() as $feed_oid=>$items) {
			$new_items = $this->getNewItems($feed_oid, $items);

			if ( !isset($_SERVER['DOCUMENT_ROOT']) ) {
				echo count($new_items)." feed ".$feed_oid."<br />";
				echo "Posting...<br/>";
			}
			$this->treatment->process($new_items, $feed_oid);
		}
		
	}
	
	/**
	 * Определить новые итемы в потоке, и обновить слепки в хранилище
	 * @param int $feed_oid
	 * @param array $items
	 */
	public function getNewItems($feed_oid, array $items) {
		$snapshot = $this->rss_fs->getSnapshotsByFeedOid($feed_oid);
		
		$new_hashes = array();
		$new_items = array();
		foreach ($items as $item) {
			$item_hash = $this->rss_fs->makeHash($item->link.$item->title);
			
			$a = &$snapshot[$item_hash];
			if (isset($a)) {
				$a = 0;
			} else {
				$new_hashes[] = $item_hash;
				$new_items[] = $item;
			}
		}
		
		$remove_oids = array();
		foreach ($snapshot as $k=>$v) {
			if ($v != 0) $remove_oids[] = $v;
		}
		
		$this->rss_fs->rmSnapshots($remove_oids);
		$this->rss_fs->addSnapshots($new_hashes, $feed_oid);
		return $new_items;
	}
}
